package com.kanshu.service.impl;

import com.kanshu.constant.EnrollType;
import com.kanshu.constant.SignType;
import com.kanshu.constant.StatusType;
import com.kanshu.model.BreakOut;
import com.kanshu.model.SocketUser;
import com.kanshu.model.User;
import com.kanshu.service.MenuService;
import com.kanshu.service.UserService;

import java.io.IOException;
import java.util.Scanner;

/**
 * @author GAIst
 * ClassName UserServiceImpl.java
 * From
 * Description OK
 * createTime 2024年12月20日14:32:26
 */
public class UserServiceImpl implements UserService {
    private SocketUser socketUser = new SocketUser();
    private MenuService menuService = new MenuServiceImpl();
    private StatusType statusType = new StatusType();

    public UserServiceImpl() throws IOException {
    }

    /**
     * 登录方法，用于处理用户登录逻辑
     *
     * @param sca Scanner对象，用于从控制台获取用户输入
     * @return BreakOut对象，包含登录结果和是否退出的信息
     */
    @Override
    public BreakOut login(Scanner sca) {
        // 初始化登录界面文本
        SignType signType = new SignType();
        // 初始化退出状态对象
        BreakOut breakOut = new BreakOut();
        // 打印登录界面欢迎文本
        System.out.println(signType.getOUTPUT_TEXT());

        // 提示用户输入用户名
        System.out.print(signType.getOUTPUT_TEXT_USERNAMEE());
        String username = sca.nextLine();
        // 提示用户输入密码
        System.out.print(signType.getOUTPUT_TEXT_PASSWORD());
        String password = sca.nextLine();

        // 默认设置登录结果为失败，未退出系统
        breakOut.setResult(false);

        // 检查用户名和密码是否都为空
        if (username.equals(statusType.getZERO()) && password.equals(statusType.getZERO())) {
            // 如果都为空，则设置登录结果为成功，且退出系统
            breakOut.setResult(true);
            return breakOut;
        }

        // 创建User对象，用于发送到服务器验证
        User user = new User(username, password);
        user.setAction(statusType.getLOGIN());

        // 发送用户登录信息到服务器，并接收结果
        String result;
        try {
            result = (String) socketUser.send(user);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

        // 根据服务器返回的结果判断登录是否成功
        if (result == signType.getOUTPUT_SUCCESS() || result.equals(signType.getOUTPUT_SUCCESS())) {
            // 如果登录成功，打印欢迎信息
            System.out.println(signType.getOUTPUT_WELLCOME());
            // 显示主菜单
            try {
                menuService.menu(sca, statusType.getHASNULL());
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
            // 设置登录结果为成功
            breakOut.setResult(true);
        }

        // 返回退出状态对象
        return breakOut;
    }

    /**
     * 重写enroll方法，用于用户注册
     * 该方法通过控制台输入获取用户信息，并创建User对象进行注册
     *
     * @param sca Scanner对象，用于从控制台获取用户输入
     * @return 返回注册成功的User对象
     */
    @Override
    public User enroll(Scanner sca) {
        // 创建EnrollType对象，用于获取注册过程中的提示文本
        EnrollType enrollType = new EnrollType();

        // 提示用户输入用户名
        System.out.print(enrollType.getOUTPUT_TEXT_USERNAME());
        // 读取用户输入的用户名
        String username = sca.nextLine();

        // 提示用户输入密码
        System.out.print(enrollType.getOUTPUT_TEXT_PASSWORD());
        // 读取用户输入的密码
        String password = sca.nextLine();

        // 使用获取的用户名和密码创建User对象
        User user = new User(username, password);

        // 设置User对象的动作状态为注册
        user.setAction(statusType.getENROLL());

        // 尝试发送User对象以完成注册过程
        try {
            socketUser.send(user);
        } catch (IOException e) {
            // 如果发送过程中出现IOException，将其包装成RuntimeException并抛出
            throw new RuntimeException(e);
        }

        // 返回注册成功的User对象
        return user;
    }
}
